/*
** Copyright (C) 2011 Viens Yann
**
** This program is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "Filters.hpp"
#include "ImageProcessor.hpp"

void		Filters::add(std::string const& key, Filter value)
{
	_filters[key] = value;
}

void		Filters::remove(std::string const& key)
{
	std::map<std::string, Filter>::iterator	it = _filters.find(key);
	
	if (it != _filters.end())
		_filters.erase(it);
}

IplImage*	Filters::processFilters(IplImage* input)
{
	Processor	processor(this, input);
	
	for_each(_filters.begin(), _filters.end(), processor);
	return processor._output;
}

Filters::Processor::Processor(Filters* caller, IplImage* input): _caller(caller), _output(input)
{
}

void		Filters::Processor::operator()(std::pair<const std::string, Filter>& elem)
{
	_output = (_caller->*(elem.second))(_output);
}

IplImage*	Filters::revert(IplImage* input)
{
	return ImageProcessor::horizontalInvert(input);
}